namespace hao_Common.Consul.Services
{
    /// <summary>
    /// 服务发现接口
    /// 提供服务发现和负载均衡功能
    /// </summary>
    public interface IServiceDiscovery
    {
        /// <summary>
        /// 异步获取服务的访问地址
        /// 通过负载均衡算法从健康的服务实例中选择一个
        /// </summary>
        /// <param name="serviceName">服务名称</param>
        /// <returns>服务访问 URL，如果没有可用实例则返回 null</returns>
        Task<string?> GetServiceUrlAsync(string serviceName);

        /// <summary>
        /// 异步获取服务的所有健康实例
        /// 返回详细的服务实例信息列表
        /// </summary>
        /// <param name="serviceName">服务名称</param>
        /// <returns>健康的服务实例详细信息列表</returns>
        Task<List<ServiceInstance>> GetHealthyServiceInstancesAsync(string serviceName);
    }

    /// <summary>
    /// 服务实例信息类
    /// 封装服务实例的详细信息
    /// </summary>
    public class ServiceInstance
    {
        /// <summary>
        /// 服务实例唯一标识符
        /// </summary>
        public string ServiceId { get; set; } = string.Empty;

        /// <summary>
        /// 服务名称
        /// </summary>
        public string ServiceName { get; set; } = string.Empty;

        /// <summary>
        /// 服务实例地址
        /// IP 地址或主机名
        /// </summary>
        public string Address { get; set; } = string.Empty;

        /// <summary>
        /// 服务实例端口号
        /// </summary>
        public int Port { get; set; }

        /// <summary>
        /// 服务标签列表
        /// 用于服务分类和过滤
        /// </summary>
        public string[] Tags { get; set; } = Array.Empty<string>();
    }
}